#include <REGX52.H>
#include <Delay.H>

sbit RCK = P3^5;  // RCLK  上升沿移位
sbit SCK = P3^6;  // SRCLK  上升沿锁存
sbit SER= P3^4;		// SER    


#define MATRIX_LED_PORT   P0

/**
  *  @brief 74HC595 写入一个字节
  *  @param 要写入的字节
  *  @retval 无
  */
void _74HC595_WriteByte(unsigned char Byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		// 位对齐,最高位是1则=0x80，则置为高电平
		// 反之置为低电平
		// 依次往下一位一位的移动到(并行输出)移位寄存器。
		SER = Byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
	// 上升沿
	RCK = 1;
	// 置零
	RCK = 0;
}

/**
  *  @brief LED点阵屏显示一列数据
  *  @param colomn 要选择的列，范围：0~7，0在最左边
  *  @param Data 选择列显示的数据，高位在上，1为
  *  @retval 无
  */
void MatrixLed_showColumn(unsigned char column,Data)
{
	_74HC595_WriteByte(Data);
	MATRIX_LED_PORT=~(0x80>>column);
	Delay(1);
	MATRIX_LED_PORT=0xFF;
}

void main()
{
	// 单片机上电初始化io口都为高电平,需要将对应要操作的io口置为低电平。
	SCK = 0;
	RCK = 0; 
	
	while(1)
	{
		MatrixLed_showColumn(0,0x3C);
		MatrixLed_showColumn(1,0x42);
		MatrixLed_showColumn(2,0xA9);
		MatrixLed_showColumn(3,0x85);
		MatrixLed_showColumn(4,0x85);
		MatrixLed_showColumn(5,0xA9);
		MatrixLed_showColumn(6,0x42);
		MatrixLed_showColumn(7,0x3C);
	}
	
}